package net.lzzy.practices.entities;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;


/**
 * @author liaodcc.
 * extends = 继承
 * //@Entity 标识该类为实体类
 */

@Entity
@Getter
@Setter
public class User extends BaseEntity {
    /**
     * -1代表禁止访问
     * 0代表管理员
     * 1代表教师
     * 2代表学生
     */
    @Transient
    public static final int TYPE_BANNED = -1;
    @Transient
    public static final int TYPE_ADMIN = 0;
    @Transient
    public static final int TYPE_TEACHER = 1;
    @Transient
    public static final int TYPE_STUDENT= 2;
    private String nickName;
    private String userName;
    private String email;
    private String phone;
    private String password;
    private String avatar;
    private int type;
    private String salt;
    private boolean applyTeacher;
    @Temporal(TemporalType.TIMESTAMP)
    private Date createTime;
    /**
     *  Temporal(TemporalType.TIMESTAMP)注解Data类型字段，从数据库获取带有日期和时间的值，
     *  若为DATE则仅带日期不带时间，若为TIME则仅带时间不带日期
     */
    @Temporal(TemporalType.TIMESTAMP)
    private Date updateTime;

    /**
     * //表示一名教师可以对多个课程
     */
    @OneToMany(mappedBy = "teacher")
    private List<Course>courses = new ArrayList<>();
    @ManyToMany(mappedBy = "students")
    private List<Course> enrolledCourses = new ArrayList<>();

    @OneToMany(mappedBy = "student")
    private List<Result> results = new ArrayList<>();

    @OneToMany(mappedBy = "student")
    private List<Applicant>applicants = new ArrayList<>();
    public User(){
        createTime = new Date();
        updateTime = createTime;
    }
    @JsonManagedReference
    public List<Result> getResults() {
        return results;
    }

    @JsonManagedReference
    public List<Applicant> getApplicants() {
        return applicants;
    }

    @JsonManagedReference
    public List<Course> getCourses(){
        return courses;
    }
    @JsonIgnore
    public List<Course> getEnrolledCourses(){
        return enrolledCourses;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj){
            return true;
        }
        if (obj == null ||obj.getClass()!=getClass()){
            return false;
        }
        User user = (User) obj;
        return id.equals(user.getId());
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}
